/**
 * 接口：
 * 语法： interface 接口名 {}
 * 接口名：首字母要求大写，尽量使用 I
 * 
 * 接口作用：
 * 1. 限定一个对象具体的属性
 */


interface Iperson{ // 定一个Iperson的接口，该接口限定两个属性 
    readonly name:string // readonly name就只能读不能改
    age:number
    sex?:string, // 可选参数
    // cook():void
    cook:()=>void
}

let user:Iperson = {
    name:'atguigu',
    age:10,
    cook(){
        console.log('我会做饭')
    }
}

let user2:Iperson = {
    name:'尚硅谷',
    age:11,
    sex:'男',
    cook(){
        console.log('i can cooking')
    }
}

console.log(user2.age,user2.name,user2.sex); // 读取

// user2.name = '中国';//无法分配到 "name" ，因为它是只读属性

// 限定user是 Iperson接口 user.就可以进行语法提示



console.log(user.name, user.age)


// 接口与类： 类可以实现接口，实现了接口的类，就必须要有接口中要求的属性和方法

interface Ilight{
    name:string;
    open:()=>void
}
interface ISofa{
    material:string
}


class Car implements Ilight{
    name:string
    age:number
    open(){
        console.log('open');
    }
    start(){

    }
}
// 一个类可以实现多个接口
class Supercar implements Ilight,ISofa{
    name: string
    material:string
    constructor(name:string, material:string){
        this.name = name;
        this.material = this.material
    }
    open(){
        console.log('开超跑')
    }
}

// 接口可以继承接口
interface IComplex extends Ilight,ISofa{

}

class Bus implements IComplex{
    name: string
    material:string
    open(){
        console.log('xxxx');
    }
}

// 接口可以重复定义

interface IPerson{
    name:string
}

interface IPerson{
    age:number
}
// 以上重复定义，相当于是104-107行的内容
// interface IPerson{
//     name:string
//     age:number
// }



let p:IPerson = {
    name:'atguigu',
    age:10
}

// 对象 数组

